java进行图片合成以及写入自定义字体

由于工作需要做了一个利用java的Graphics2D进行图片合成且在图片上写入自定义字体文字的小功能,
那就顺便记录一些痕迹,有什么不好的地方请见谅
 
 
 
 
 
public static void main(String[] args){
    try {
        //创建画布
        BufferedImage image = new BufferedImage(480,270,BufferedImage.TYPE_INT_RGB);
        //背景图(使用网络链接获取)
        BufferedImage background = ImageIO.read(new URL("http://.../background.png"));
        //头像(使用本地路径获取)
        BufferedImage icon = ImageIO.read(new File("C:\\...\Desktop\\doctor.png"));
        //字体背景图
        BufferedImage fontBd = ImageIO.read(new URL("http://.../fontBd.png"));
        //开启画图
        Graphics2D graphics = image.createGraphics();
        //把背景图、头像添加到画布中
        graphics.drawImage(background.getScaledInstance(480,270,Image.SCALE_DEFAULT),0,0,null);
        graphics.drawImage(icon.getScaledInstance(180,227,Image.SCALE_DEFAULT),283,42,null);
        //写入标题,标题引入自定义字体
        Font font = FontUtils.getFont(1,40);
        graphics.setColor(Color.decode("#333333"));
        graphics.setFont(font);
        FontUtils.drawString("论标题的重要性",20,105,6,graphics,40);//将字符串按照自定义的间隔写入,防止字体全部写在同一个地方
        //添加字体背景 
        graphics.drawImage(fontBd.getScaledInstance(doctorMessage.length()*17,35,Image.SCALE_DEFAULT),20,136,null); 
        //写入信息
        graphics.setFont(new Font("微软雅黑", Font.BOLD, 17)); 
        graphics.setColor(Color.white); 
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); //去字体锐化
        graphics.drawString("陌陌 特级医师", 32, 159); 

        //写入信息 
        graphics.setFont(new Font("微软雅黑", Font.PLAIN, 17)); 
        graphics.setColor(Color.decode("#333333")); 
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
        graphics.drawString("中南第二医院 内外科", 20, 199); 
        //关闭画布创作 
        graphics.dispose();
        //根据画布内容生成图片 
        ImageIO.write(image, "png", new File("C:\\.....\\Desktop\\j.png")); 
        System.out.println("图片生成完毕"); 
    } catch (Exception ex) { 
        System.out.println("error: "+ex.getMessage()); 
        ex.printStackTrace(); 
    } 

}

 
/**
 *  引入自定义的字体
 * @param fontStyle 字体样式
 * @param fontSize  字体大小
 * @return
 */
public static Font getFont(int fontStyle, float fontSize) {
    Font font = null;
    FileInputStream fileInputStream = null;
    String fontUrl = "";
    try {
        switch (fontStyle) {
            case 1:
                //文悦新青年体
                fontUrl = "C:\\...\\Desktop\\youth.OTF";
                break;
            default:
                fontUrl = "C:\\...\\Desktop\\vagrom.otf";
                break;
        }
        fileInputStream = new FileInputStream(new File(fontUrl));
        Font tempFont = Font.createFont(Font.TRUETYPE_FONT,fileInputStream);
        font = tempFont.deriveFont(fontSize);
        GraphicsEnvironment ge = GraphicsEnvironment
                .getLocalGraphicsEnvironment();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return font;
}
 
 
/**
 * 将字符串按照自定义的间隔写入
 * @param str   目标字符串
 * @param x     写入的位置的x * @param y     写入的位置的y * @param rate  写入间隔
 * @param g     画布
 * @param fontSize  字体的大小
 */
public static void drawString(String str,int x,int y,int rate, Graphics2D g,int fontSize){
    String tempStr="";
    int tempx=x;
    int tempy=y;
    while (str.length()>0){
        tempStr=str.substring(0, 1);
        str=str.substring(1, str.length());
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawString(tempStr, tempx, tempy);
        tempx = tempx + fontSize - rate;
    }
}


效果图: 效果图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值